package entity

import "fmt"

/**
  结构体 人类
*/
type Person struct {
	Name    string
	Age     int64
	Sex     string
	Mother  *Person // 指针类型
	Father  *Person // 指针类型
	Company         // 匿名字段，代表的是，他所属的公司是哪个
	remark  string  // 不能够被别的包使用 只能是内部属性使用
}

// 加*号代表的是 结构是引用传递  不是值传递
func (person *Person) AddAge() {
	person.Age += 1
}

func (p Person) SayBye() {
	fmt.Println("Bye")
}

func (p Person) SayHello() {
	fmt.Println("Hello")
}

/**
  序列化人类对象
*/
func (person Person) ToString() {
	fmt.Printf("名字:%s \n", person.Name)
	fmt.Printf("性别:%s \n", person.Sex)
	fmt.Printf("年龄:%d \n", person.Age)
}

// 定义公司结构体
type Company struct {
	companyAddr string
	companyTel  int16
}

// 每个package包中都可以有一个init方法、执行顺序是大于主main包的main方法函数.
func init() {
	p := Person{Name: "张三", Age: 18, Sex: "男"}
	fmt.Printf("%s的年龄是%d：\n", p.Name, p.Age)
	p.AddAge() // 传值之后代表的引用类型传递
	fmt.Printf("%s的年龄是%d：\n", p.Name, p.Age)

	var pp *Person = &Person{}
	pp.Name = "李四"
	com := Company{companyAddr: "北京市", companyTel: 110}
	pp.Company = com
	fmt.Printf("%s的公司地址是在%s\n", pp.Name, pp.companyAddr)
	fmt.Printf("%s的公司地址是在%s\n", pp.Name, pp.Company.companyAddr)
}
